iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0

大家好我是因為介紹水了兩天的人(並沒有XD),今天會介紹gym的一些基礎設定,並且會簡單的介紹pybullet!這些對於環境的設定相當重要,沒有這些設定,環境就跑不動TT。今天也邁入第10天了,想想也過了1/3,再堅持一下就可以完成這個目標了,現在一天的生活就是早起上課,然後下課後回來泡在點腦桌前面寫code,除了要發文外還要照顧機器人的訓練狀態,要是有什麼閃失,可能就無法完賽了,另外還有一些研究正在進行,希望一切都能順利,也希望我的肝不會爆~今天有點扯太多了,我們馬上收心來看看gym基本的方法吧。

基本API

我們可以看到最最基本的就是建立環境,昨天有簡單提到使用env = gym.make('env')就可以輕鬆建立環境,環境建立好以後,可以用以下方法確認環境是否可用:

from gym.utils.env_checker import check_env
print(check_env(env))

環境設定好以後接下來要定義動作空間(action space)跟觀察空間(observation space)了。

基本上定義這兩個空間會是覆寫gym.Env的物件,所以命名需要一字不差,另外觀察空間中的狀態值每一個都要設定,例如狀態是當前坐標[x,y,z],那觀察空間的向量長度就也要是3,並分別為x,y,z都定義出上下限,了解基本規則後那就來定義這兩個空間吧。

import numpy as np
import gym
from gym import space
class Myenv(gym.Env):
	def __init__():
		action_low=np.array([-1,1,2],dtype=np.float32)
		action_high=np.array([5,5,7],dtype=np.float32)
		observation_low=np.array([-1,-1,0],dtype=np.float32)
		observation_high=np.array([10,15,10],dtype=np.float32)
		#定義動作、觀察空間
		self.action_space=space.Box(low=action_low,high=action_high)
		self.observation_space=space.Box(low=observation_low,high=observation_high)
		#從定義的空間中隨機採樣
		print(self.action_space.sample())
		print(self.observation_space.sample())

可以看到範例中我們從gym.space中使用了Box()這樣的一個空間,這個意思是連續空間,除了這個以外當然也有其他空間可供我們使用,接下來我們一個一個來看:

Box(low, high):連續的空間,我們會用low跟high來定義這空間的上限跟下限,參數內容填np.array就好了。每次action就會從這個區間中生成一個值填入。或者如果所有值的上下限都一樣的話,可以直接寫成例如space.Box(low=-1.0, high=5.5, shape=(3, ), dtype=np.float32)這樣比較方便也比較好讀。本專案也是用這個空間。

Discrete():離散空間,方法內填入一個整數,代表action可選擇的種類,這方法有一個可選參數start代表起始值,預設是0。這空間主要應用在離散的情況,例如圈圈叉叉,一共有9個格子可選,當中不存在5.6個格子,這種情況下就稱為離散,所以動作空間就可以定義Discrete(9),生成的action就會是0~8的數字,接下來再分別定義0~8分別要下在哪個格子就好。例如:

observation_space = Discrete(9)
print(observation_space.sample())
# 1

Dict():這個空間就是分類再細一點,或者有多樣的類型可使用,來看看官方文檔的範例:

observation_space = Dict({"position": Discrete(2), "velocity": Discrete(3)})
print(observation_space.sample())
#OrderedDict([('position', 0), ('velocity', 1)])

可以看到它定義兩個類型,一個是"position",另一個是"velocity",前者有兩個狀態空間,後者有三個狀態空間,隨機採樣就可以看到觀察值被整合成一個類似dict的資料型態。也可以使用不同種類的空間,例如今天環境是一個對打遊戲,在action上會選擇招式(離散數值,使用Discrete)還有選擇攻擊力道(連續數值,使用Box),這種情況就會兩者混用。不過使用上較為複雜,需注意。

Tuple():跟Dict類似,只是沒有定義key而已,定義上也是可以把不同空間包裝成tuple的形式,例如:

observation_space = Tuple((Discrete(2), Discrete(3)))
print(observation_space.sample())
#(1, 2)

MultiBinary():這個方法也是填入整數,但出來的空間會是依照你設定的整數為長度,值為0或者1,這個情況常被用在很多種action或者observation,但每個action或者observation只有兩個選擇或兩個結果上,例如選擇向前一步或者向後一步,要或不要等等之類的,請看以下範例:

observation_space = MultiBinary(5)
print(observation_space.sample())
#[1 1 1 0 1]

MultiDiscrete():那如果今天一樣很多種action或者observation而且每個action或者observation都有很多離散的選擇怎麼辦,別急,可以使用這個方法,這方法可以定義每種action或observation離散的數量,光靠文字可能有點抽象,一樣直接以範例講解:

observation_space = MultiDiscrete([ 5, 2, 2 ])
print(observation_space.sample())
#[3 0 0]

可以看到空間中有三種變量,每種變量又分別有5種、2種、2種離散的情況,這就好像寶可夢三打,三隻寶可夢分別有五種技能(第五技能為mega進化或者極巨化等)、兩種技能(等級可能不到10等,所以只有兩個技能)、兩種技能(同上)一樣,這樣的組合數是20,如果直接定義Discrete(20)的話則需要花費大量時間個別定義每一種情況,相當費時費工,所以也可以斟酌使用此方法。

注意事項

stable baselines3官方文檔上有清楚告知演算法支援的空間類型,所以如果強化學習演算法使用該模組的話在選擇空間上需要特別特別特別注意!!!

環境中所使用到的方法

接下來會個別介紹環境中所使用的方法,為什麼要介紹呢,因為之後自定義環境會繼承這些方法,所以這些方法會先簡單交給各位,未來也會直接拿gym中預設的環境再講解一次這些方法主要是在幹嘛的。

gym.Env.step(action):這個方法輸入為action,action會照著action space的格式輸入這個方法,在這個方法內要定義此action如何跟環境交互,並且會產生什麼樣的結果,交互完後需要return observation reward done info。這四個回傳值的意思昨天介紹過了,忘記的話可以回去看看!

gym.Env.reset():這個方法為初始化環境使用,在這邊可以設定環境中所有物件以及狀態的初始值,並回傳當前的observation。

gym.Env.render():這個方法為渲染環境,具體作用我也不太清楚(沒有使用過),不過基本上是用來將環境或者訓練情況可視化的,但我這個部分都直接寫在step方法裏面,那也是因人而異啦~

gym.Env.close():關閉環境,一些虛擬環境需要依賴某些方法才可以正常關閉該環境,例如tkinter需要使用tk.destroy(),之後介紹的pybullet要使用pybullet.disconnect()來關閉。

gym.Env.seed():設定亂數種子,在實驗上就不會因為隨機的情況造成每次實驗結果都有些微的差異。

Env.reward_range=(下限,上限):跟動作、觀察空間一樣,這也是繼承Env的物件,主要是設定reward的值域。

結語

今天一口氣講了許多東西,時間也不早了,明天還要繼續上課嗚嗚,不過總算開始踏入到強化學習的殿堂了,雖然還沒開始正式訓練,明天會帶各位看一些gym中有趣的環境。那今天就差不多這樣,各位明天見了!

參考資料、網址

https://pybullet.org/wordpress/


上一篇
D9:強化學習入門!Open AI Gym介紹
下一篇
D11:Open Ai Gym 環境介紹
系列文
高中生也可以!利用強化學習讓機器人動起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言